package tacos.messing.JMSMessage;

import org.apache.activemq.artemis.jms.client.ActiveMQQueue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.jms.support.converter.MappingJackson2MessageConverter;
import tacos.domain.Order;

import javax.jms.Destination;
import java.util.HashMap;
import java.util.Map;

@Profile("jsm-template")
@Configuration
public class MessagingConfig {

    @Bean
    public Destination orderQueue(){
        /**
         * 自定义Artemis的消息发送地址
         */
        return new ActiveMQQueue("taco.order.queue");
    }

    /***
     * 默认使用SimpleMessageConverter,但是他要求被发送的对象实现Serializable
     * 声明这个Bean会使用  MappingJackson2MessageConverter 代替 SimpleMessageConverter
     * @return
     */
    @Bean
    public MappingJackson2MessageConverter messageConverter() {
        /**
         * 这样setTypeIdPropertyName 让接收这知道传入的消息要转换成什么类型，默认情况下，它将会包含要转换类型的全限定类名。
         * 但是，这样不太灵活，要求接收端也包含相同的类型，并具有相同的全限定类名
         */
        MappingJackson2MessageConverter messageConverter =
                new MappingJackson2MessageConverter();
        messageConverter.setTypeIdPropertyName("_typeId");

        Map<String, Class<?>> typeIdMappings = new HashMap<String, Class<?>>();
        // 未来实现更大的灵活行，调用setTypeIdMappings将一个合成类型名映射到实际类型上。
        // 入选代码将一个合成的order类型ID映射为Order类
        typeIdMappings.put("order", Order.class);
        messageConverter.setTypeIdMappings(typeIdMappings);

        return messageConverter;
    }
}
